package gruppe5.dame.client.gui.Lobby;

import gruppe5.dame.client.Chat;
import gruppe5.dame.client.Hauptfenster;
import gruppe5.dame.server.rfc.objects.cGameCreateRequest;
import gruppe5.dame.server.rfc.objects.cGameJoinRequest;
import gruppe5.dame.server.rfc.objects.cPackageHeader;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JPanel;

/**
 * Haupt-UI-Element der Lobby
 * 
 * @author kramerse
 * 
 */
public class LobbyGUI extends JPanel {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -6151290760199599101L;

	/**
	 * Netzwerkkommunikation in der Lobby
	 */
	private NetzwerkLobby netzwerk;
	
	/**
	 * Spieleliste
	 */
	private Gamelist gamelist;

	/**
	 * Lobby Chat
	 */
	private Chat chat;

	/**
	 * Liste der am Server angemeldeten Spieler
	 */
	private Userlist userlist;

	/**
	 * Panelelement mit verschiedenen Buttons
	 */
	private Buttonpanel buttonpanel;
	
	/**
	 * Liste mit angemeldeten Spieler
	 */
	private String[] list;

	/**
	 * Hauptfenster
	 */
	private Hauptfenster frame;

	/**
	 * Konstruktor
	 * @param frame
	 *            Hauptfenster
	 */
	public LobbyGUI(Hauptfenster frame) {
		this.netzwerk = new NetzwerkLobby(frame.getSocket(), this);
		this.frame = frame;
		gamelist = new Gamelist(this);
		//TODO Chat wird nicht Angezeigt
		chat = this.frame.getChat();
		chat.setBackground(new Color(255, 0, 0));
		userlist = new Userlist(this);
		buttonpanel = new Buttonpanel(this);
		
		try {
			list = netzwerk.getUserList();
		} catch (Exception e) {
		}
		if(list.length==0)
			list[0] = "Keine Benutzer online";
		userlist.setList(list);

		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(2, 1));
		panel.add(gamelist);
		panel.add(chat);

		JPanel panel1 = new JPanel();
		panel1.setLayout(new BorderLayout());
		panel1.add(panel, BorderLayout.CENTER);
		panel1.add(buttonpanel, BorderLayout.SOUTH);

		this.setLayout(new BorderLayout());
		this.add(userlist, BorderLayout.EAST);
		this.add(panel1, BorderLayout.CENTER);
	}

	/**
	 * @return the gamelist
	 */
	public Gamelist getGamelist() {
		return gamelist;
	}

	/**
	 * @return the chat
	 */
	public Chat getChat() {
		return chat;
	}

	/**
	 * @return the userlist
	 */
	public Userlist getUserlist() {
		return userlist;
	}

	/**
	 * @return the buttonpanel
	 */
	public Buttonpanel getButtonpanel() {
		return buttonpanel;
	}
	
	/**
	 * @return Der Benutzername des Clients.
	 */
	public String getUsername() { return frame.getUsername(); }

	/**
	 * Spiel beitreten
	 */
	public void joinGame() {
		joinGame(gamelist.getSelectedGameName());
	}

	/**
	 * Einladung senden
	 */
	public void sendInvite() {
		String name = userlist.getSelectedUserName();
		sendInvite(name);
	}

	/**
	 * Buttons umschalten zwischen Raum beitreten und Spieler einladen
	 * 
	 * @param enable
	 */
	public void enableGamelist(Boolean enable) {
		buttonpanel.enableGameList(enable);
	}
	
	public void disableJoinAndInvite() {
		buttonpanel.disableJoinAndInvite();
	}	

	/**
	 * Einladung empfangen
	 * 
	 * @param name
	 *            Username
	 */
	public void invitRecieved(String name) {
		buttonpanel.enableInviteButton(true);
	}

	/**
	 * setzt Userlist
	 * @param namen Namen der am Server angemeldeten Spieler
	 */
	public void setUserList(String[] namen) {
		userlist.setList(namen);
	}

	/**
	 * holt Raumliste vom Netzwerk
	 * @return Raumliste
	 */
	public Object[][] getRoomList() {
		return netzwerk.getRoomList();
	}
	
	/**
	 * gibt die Einladung ans Netzwerk
	 * 
	 * @param name
	 *            Benutzername des eingeladenen Spielers
	 */
	public void sendInvite(String name) {
		netzwerk.inviteUser(name);
	}
		
	/**
	 * Benutzer nimmt die Einladung an
	 */
	public void returnInvite() {
		buttonpanel.enableInviteButton(false);
		netzwerk.returnInvite(true);
	}

	/**
	 * gibt den Joinwunsch des Benutzers ans Netzwerk
	 * 
	 * @param name
	 *            Benutzername des Spielers der das Spiel hostet
	 */
	public void joinGame(String name) {
//		netzwerk.joinGame(name);
		frame.get_RFC().Client_SendPackage(new cGameJoinRequest(cPackageHeader.PackageType.GameJoinRequest, name));
	}
		
	/**
	 * gibt den Hostwunsch des Benutzters ans Netzwerk
	 */
	public void hostGame() {
//		frame.enterGame();
//		netzwerk.hostGame();
		frame.get_RFC().Client_SendPackage(new cGameCreateRequest(cPackageHeader.PackageType.GameCreateRequest));
	}

	/**
	 * Setzte die Raumliste
	 * @param list
	 */
	public void setRoomList(Object[][] list) {
		// TODO setRoomList
		gamelist.setData(list);
	}

	/**
	 * Spieler betritt Spiel
	 */
	public void enterGame() {
		frame.enterGame();
	}
}